// function foo() {
//     console.log(this.a);
// }
// var obj = {
//     a: 2,
//     foo: foo,
//     b: function() {
//         console.log(this);
//     }
// }
// var obj1 = {
//     a: 3,
// }
// foo.call(obj1);
// var baz = function() {
//     foo.call(obj1);
// }
// baz();
// obj.foo();
// var bar = obj.foo;
// var a = 'nihao!';
// bar();
// obj.b();


// 显示绑定

// function foo(something) {
//     console.log(this.a, something);
//     return this.a + something
// }
// var obj = {
//     a: 2
// }
// var bar = function() {
//         return foo.apply(obj, arguments);
//     }
//     //手写bind
// function bind(foo, obj) {
//     return function() {
//         return foo.apply(obj, arguments);
//     }
// }
// // var b = bar(3);
// // console.log(b);
// var baz = bind(foo, obj);
// // var b = baz(3);
// console.log(baz(3));

// new 绑定
// function foo(a) {
//     this.a = a
//     console.log(this.a);
// }
// var bar = new foo(2);
// console.log(bar);


//优先级
// function foo() {
//     console.log(this.a);
// }
// var obj1 = {
//     a: 2,
//     foo: foo
// }
// var obj2 = {
//     a: 3,
//     foo: foo
// }
// obj1.foo(); //2
// obj2.foo(); //3
// obj1.foo.call(obj2); //3
// obj2.foo.call(obj1); // 2


//箭头函数
function foo() {
    return (a) => {
        console.log(this.a);
    }
}
var obj1 = {
    a: 2
}
var obj2 = {
    a: 3
}
var bar = foo.call(obj1);
// console.log(bar);
bar.call(obj2); //2